/**
 * 1.includes、startsWith、endsWith
  includes()：返回布尔值，表示是否找到了参数字符串。
  startsWith()：返回布尔值，表示参数字符串是否在原字符串的头部。
  endsWith()：返回布尔值，表示参数字符串是否在原字符串的尾部。

  第二个参数n
    includes、startsWith是从第n个位置直到字符串结束
    endsWith是前n个字符
 */
const str = 'Hello world!';
str.startsWith('Hello') // true
str.endsWith('!') // true
str.includes('o') // true

str.startsWith('Hello',4) // false
str.includes('o', 4); // true
str.endsWith('!', 4) // false



/**
 * 2.repeat(n)
  repeat方法返回一个新字符串，表示将原字符串重复n次
 */
const str1 = 'hello'
str1.repeat(2) // 'hellohello'

// 如果n为0 则返回空字符串
str1.repeat(0) // ''

// 如果n为小数 则取整 
str1.repeat(1.3) // 'hello' 1.3取整当成1处理

// 如果n是负数或者Infinity 会报错
// str1.repeat(-1) // RangeError: Invalid count value
// str1.repeat(Infinity) // RangeError: Invalid count value

// 如果参数n是0到-1的小数 进行取整运算 成-0 repeat 当成0处理
str1.repeat(-0.2)

// 参数n 为NaN等同于0
str1.repeat(NaN) // ""

// 参数n 是字符串 先转化成数字
str1.repeat('hello') // "" 'hello'-NaN-0
str1.repeat('3') // "hellohellohello" '3'-3




/**
 * 3.padStart()，padEnd() 字符串补全长度
 padStart()用于头部补全，padEnd()用于尾部补全
 一共接受两个参数，第一个参数是字符串补全生效的最大长度，第二个参数是用来补全的字符串
 */

const str3 = 'str3'

// 字符串长度 大于 第一次参数长度 返回原字符串
str3.padStart(2, 'ab') // 'str3'
str3.padEnd(2, 'ab') // 'str3'

// 补全的字符串（第二个参数）与原字符串 两者长度之和大于第一个参数 截取超出部分
str3.padStart(5, 'ab') // 'astr3' ‘abstr3'  6 > 5  'astr3'
str3.padEnd(5, 'ab') // 'str3a'   ‘str3ab'  6 > 5  'str3a'

// 省略第二个参数，默认第二个参数 为空格
str3.padStart(5) // ' str3'
str3.padEnd(5)  // 'str3 '

// 常用: 为数值补充位数 字符串格式
'123456'.padStart(10, '0') // "0000123456"
'09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"




/**
 * 4.trimStart()，trimEnd() 
 trimStart()消除字符串头部的空格，trimEnd()消除尾部的空格。返回新字符串，不修改原字符串
 浏览器还部署了额外的两个方法，trimLeft()是trimStart()的别名，trimRight()是trimEnd()的别名
 除了空格键，这两个方法对字符串头部（或尾部）的 tab 键、换行符等不可见的空白符号也有效。
 */
const str4 = '  str4   ' // 前面空格是tab产生的
str4.trim() // "str4"
str4.trimStart() // "str4   "
str4.trimEnd() // "  str4"




/**
 * 5.replaceAll()
  一次性替换所有匹配
  返回一个新字符串，不会改变原字符串
 */
const str5 = 'str55'
console.log(String.prototype);
str5.replaceAll('5', '_') // 'str__'

// String.prototype.replaceAll(searchValue, replacement)

// searchValue是一个不带有g修饰符的正则表达式，replaceAll()会报错
str5.replaceAll(/b/, '_') // Uncaught TypeError: String.prototype.replaceAll called with a non-global RegExp argument

/**
 * replacement是一个字符串，表示替换的文本，其中可以使用一些特殊字符串
  $&：匹配的字符串。
  $`：匹配结果前面的文本。
  $'：匹配结果后面的文本。
  $$：指代美元符号$
 */
str5.replaceAll('5', '$&') // 'str55'
str5.replaceAll('5', '$`') // 'strstrstr5' 第一个5前面文本'str' 第二个5前面文本'str5'
str5.replaceAll('5', `$'`) // 'str5' 第一个5后面文本'5' 第二个5后面文本''
str5.replaceAll('5', '$$') // 'str$$' 第一个5替换成'$' 第二个5替换成'$'

// replaceAll()的第二个参数replacement除了为字符串，也可以是一个函数，该函数的返回值将替换掉第一个参数searchValue匹配的文本
str5.replaceAll('5', () => '_') // 'str__'



/**
 * 6.at
 接受一个整数作为参数，返回参数指定位置的字符，支持负索引（即倒数的位置）。
 参数位置超出了字符串范围，at()返回undefined
 */
const str6 = 'str6'
str6.at(1) // 't'
str6.at(-1) // '6'
str6.at(6) // 'undefined'